package ma.ac.onousc.gestionfi.budget.model.DAO.DAOBean;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;

import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import ma.ac.onousc.gestionfi.budget.model.Etablissement;
import ma.ac.onousc.gestionfi.budget.model.ProgrammeEmploi;
import ma.ac.onousc.gestionfi.budget.model.Rubrique;
import ma.ac.onousc.gestionfi.budget.model.RubriqueBudgetaire;
import ma.ac.onousc.gestionfi.budget.model.TypeBudget;
import ma.ac.onousc.gestionfi.budget.model.DAO.RubriqueBudgetaireDAO;

import org.primefaces.model.TreeNode;

@Stateless
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class RubriqueBudgetaireDAOBean extends
		GenericEJB3Bean<RubriqueBudgetaire, Integer> implements
		RubriqueBudgetaireDAO {

	@SuppressWarnings("unchecked")
	@Override
	public List<RubriqueBudgetaire> findAllRubriqueBudgetaire() {
		return this.getEntityManager()
				.createNamedQuery("RubriqueBudgetaire.findAll").getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<RubriqueBudgetaire> findRubriqueBudgetaireByTypeBudget(
			TypeBudget typeBudget, ProgrammeEmploi pe) {
		return this
				.getEntityManager()
				.createNamedQuery("RubriqueBudgetaire.findByTypeBudgetAndAnnee")
				.setParameter("TYPE_BUDGET", typeBudget.getIdTypeBudget())
				.setParameter("ANNEE", pe.getAnneeProgrammeEmploi())
				.getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Object> findRubriqueBudgetaireByEtaBAnnee(
			Integer idEtablissement, int annee, int idTypeBudget) {
		return this.getEntityManager()
				.createNamedQuery("RubriqueBudgetaire.findByEtabAndAnnee")
				.setParameter("IdETAB", idEtablissement)
				.setParameter("ANNEE", annee)
				.setParameter("TYPE_BUDGET", idTypeBudget).getResultList();
	}

	@Override
	public void parcourirArbre(TreeNode arbre) {
		this.traverserEtPersister(arbre);
	}


	private void traverserEtPersister(TreeNode arbre) {
		if (arbre != null) {
			if (arbre.getData() != null) {
				if (arbre.getData() instanceof RubriqueBudgetaire && ((RubriqueBudgetaire) arbre.getData()).getProgrammeEmploi() != null) {
					RubriqueBudgetaire rb = (RubriqueBudgetaire) arbre.getData();					
					rb = this.getEntityManager().merge(rb);
				}
			}
			for (TreeNode branche : arbre.getChildren()) {
				traverserEtPersister(branche);
			}
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public HashMap<Integer, BigDecimal> findSUMByTypeBudgetAndAnnee(
			TypeBudget typeBudget, ProgrammeEmploi pe) {
		List<Object[]> liste = this
				.getEntityManager()
				.createNamedQuery(
						"RubriqueBudgetaire.findSUMByTypeBudgetAndAnnee")
				.setParameter("TYPE_BUDGET", typeBudget.getIdTypeBudget())
				.setParameter("ANNEE", pe.getAnneeProgrammeEmploi())
				.getResultList();
		HashMap<Integer, BigDecimal> hashMap = new HashMap<Integer, BigDecimal>();

		for (Object[] resultats : liste) {
			hashMap.put(((RubriqueBudgetaire) resultats[0]).getRubrique()
					.getIdRubrique(), (BigDecimal) resultats[1]);
		}

		// if (liste != null && liste.size() > 0) {
		// return (BigDecimal) liste.get(0);
		// }
		return hashMap;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<RubriqueBudgetaire> findByProgrammeEmploiAndEtablissement(
			ProgrammeEmploi annee, Etablissement etablissement) {
		return this
				.getEntityManager()
				.createNamedQuery(
						"RubriqueBudgetaire.findByProgrammeEmploiAndEtablissement")
				.setParameter("PROGRAMME_EMPLOI", annee.getIdProgrammeEmploi())
				.setParameter(
						"ETABLISSEMENT",
						etablissement != null ? etablissement
								.getIdEtablissement() : null).getResultList();
	}

	@SuppressWarnings("unchecked")
	@Override
	public RubriqueBudgetaire findByEtabAndAnneeAndRubrique(
			ProgrammeEmploi annee, Etablissement etablissement,
			Rubrique rubrique) {
		
		List<RubriqueBudgetaire> lst =  this.getEntityManager()
				.createNamedQuery("RubriqueBudgetaire.findByEtabAndAnneeAndRubrique")
				.setParameter("idEtab", etablissement.getIdEtablissement())
				.setParameter("idProemp", annee.getIdProgrammeEmploi())
				.setParameter("idRubrique", rubrique.getIdRubrique()).getResultList();
		
		return lst.get(0);
	}

}